package testy;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Klasa obsługująca cały quiz, tzn listę pytań
 *
 * @author Michał Rudowicz
 */
public class Quiz {
    public List<Pytanie> pytania;

    /**
     * Ilość pytań początkowo w bazie (przydatne do progress bara)
     */
    public int poczatkowoPytan;

    /**
     * Zmienna przechowująca indeks wylosowanego pytania
     */
    private int wylosowanePytanie;

    /**
     * Ilość karniaków doliczanych w przypadku błędu
     */
    public int kara = 5;

    /**
     * Tworzy nowy quiz, wczytując pytania z pliku
     * @param nazwaPliku Ścieżka do pliku z pytaniami.
     * @throws FileNotFoundException
     * @throws IOException
     */
    public Quiz(File plik, int poczatkowo, int karniakow) throws FileNotFoundException, IOException {
        this.pytania = new ArrayList<Pytanie>();
        this.kara = karniakow;
        this.wczytajZPliku(plik, poczatkowo);
    }

    /**
     * Losuje kolejne Pytanie
     * @return Wylosowane Pytanie
     * @throws Exception Rzuca wyjątkiem, jeśli nie ma więcej pytań
     */
    public Pytanie losujPytanie() throws Exception {
        if (this.pytania.isEmpty())
            throw new Exception("Wszystkie pytania już przerobione!");
        this.wylosowanePytanie = (int) (Math.random() * pytania.size());
        Collections.shuffle(this.pytania.get(wylosowanePytanie).odpowiedzi);
        return pytania.get(wylosowanePytanie);
    }

    /**
     * Sprawdza, czy podana odpowiedź jest prawidłowa dla ostatnio wylosowanego
     * pytania
     * @param odpowiedz Indeks wybranej odpowiedzi
     * @return -1, jeśli odpowiedź jest prawidłowa, -2, jeśli żadna odpowiedź
     *          nie jest prawidłowa, a w przeciwnym
     *          razie indeks poprawnej odpowiedzi.
     */
    public int sprawdzPytanie(int odpowiedz) {
        int wynik = pytania.get(wylosowanePytanie).sprawdzPytanie(odpowiedz, kara);
        if (pytania.get(wylosowanePytanie).count == 0)
            pytania.remove(wylosowanePytanie);
        return wynik;
    }

    /**
     * Wczytuje quiz z pliku.
     * @param nazwaPliku Ścieżka do pliku
     * @throws FileNotFoundException
     * @throws IOException
     */
    private void wczytajZPliku(File plik, int poczatkowo) throws FileNotFoundException, IOException {
        FileInputStream is = new FileInputStream(plik);
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        // Wczytujemy pytanie
        while (br.ready()) {
            Pytanie pytanie;
            String linia = br.readLine();
            
            // jeśli nie jest to linia z tytułem - olewamy
            if (!linia.matches("^\\d++[\\)\\.].+$")) {
                System.out.print("ko");
                continue;
            }
            // możnaby usunąć ten numerek z pytania ale olać na razie
            pytanie = new Pytanie(linia, poczatkowo);

            // głupi for, ale olać
            for (int i=0;i<3;i++) {
                Odpowiedz nowa;
                linia = br.readLine();
                if (linia.matches("^\\+\\D\\. .+$")) {
                    // Odpowiedź jest poprawna
                    // linia.substring to rozwiązanie na chama ale olać
                    nowa = new Odpowiedz(linia.substring(4), true);
                } else if (linia.matches("^ \\D\\. .+$")) {
                    // Odpowiedź jest niepoprawna
                    nowa = new Odpowiedz(linia.substring(4), false);
                } else {
                    // chyba odpowiedź jest niepoprawna
                    System.out.print("d");
                    break;
                }
                pytanie.odpowiedzi.add(nowa);
            }
            this.pytania.add(pytanie);
        }
        this.poczatkowoPytan = pytania.size();
        System.out.println("Wczytano " + pytania.size() + " pytań.");
    }
}
